In this post, I will analyze the results of the “épreuves classantes nationales (ECN)”, which is a competitive examination at the end of the 6th year of medical school in France. First ones get to choose first where they want to continue their medical training.

A very clean dataset

The data is in a PDF there. I’m not an expert in scraping and parsing data but this was actually very simple due to well-formatted dataset.

If you see that I’m doing something too complicated or could do it cleaner or faster, please comment this post and help learn some scraping/parsing jedi techniques.

Scraping

I’ll use package pdftools get the text from this PDF.

head(txt <- pdftools::pdf_text("https://goo.gl/wUXvjk"), n = 3)
## [1] "                                                                              Paris, le 28 juin 2017\n     Liste des étudiants et des internes de médecine, classés par ordre de\n     mérite, ayant satisfait aux épreuves classantes nationales anonymes\n    donnant accès au troisième cycle des études médicales, organisées au\n                            titre de l’année universitaire 2017-2018.\n        Nota : Il est demandé aux étudiants de vérifier les informations d’état civil les\n  concernant et d’envoyer à la gestionnaire des ECN la copie d’une pièce d’identité pour\n  prise en compte des modifications. Ces corrections sont importantes avant parution de\n                      cette liste au Journal officiel de la République française.\n0001 Mme Beaumont (Anne-Lise), née le 1 septembre 1993.\n0002 M. Petitdemange (Arthur, Paul, Joseph), né le 15 septembre 1993.\n0003 M. Bacon (Seraphin, Charly, Philippe), né le 29 janvier 1993.\n0004 M. Ditac (Geoffroy, Arnaud, André), né le 23 juin 1994.\n0005 M. Faure (Guillaume, Thomas), né le 7 août 1992.\n0006 Mme Weil (Amandine), née le 4 mars 1992.\n0007 M. Ezzouhairi (Nacim), né le 1 juin 1993.\n0008 M. Coulon (Antoine), né le 11 juin 1992.\n0009 Mme Le Gaudu (Violette, Luce, Catherine), née le 3 juin 1994.\n0010 M. Boyer (Jeremy), né le 14 mai 1993.\n0011 M. Villemaire (Axel, Michaël, Pierre), né le 24 juillet 1991.\n0012 M. Azoulay (Levi-Dan), né le 13 décembre 1993.\n0013 M. Assouline (Allan), né le 14 janvier 1994.\n0014 M. Rouchaud (Aymeric), né le 16 mai 1993.\n0015 M. Padden (Michael, James), né le 6 février 1993.\n0016 M. Gavoille (Antoine, Paul, Jean), né le 12 juillet 1994.\n0017 M. Marie (Benjamin, Pierre, Alexandre), né le 14 mars 1994.\n0018 Mlle Boulle (Charlotte, Marie, Cécile), née le 3 septembre 1988.\n0019 Mme Chatelain (Juliette), née le 23 juillet 1993.\n0020 Mme Laporte (Amandine, Capucine), née le 9 octobre 1993.\n0021 M. D'izarny Gargas (Thibaut, François, Arnaud), né le 2 mai 1993.\n0022 Mme Boccon Gibod (Clémentine, Raphaëlle), née le 24 avril 1993.\n0023 Mme Chan (Camille, Marie), née le 11 juillet 1990.\n0024 M. Lemasle (Aymeric), né le 7 avril 1994.\n0025 M. Sulman (David), né le 9 novembre 1992.\n0026 Mlle Fresnel (Clémentine), née le 5 mars 1992.\n0027 M. Dumortier (Pierre, Antoine, Frédéric), né le 19 juillet 1993.\n0028 Mme Torres-Villaros (Héloïse, Laure, Barbara), née le 18 septembre 1992.\n0029 M. Memmi (Benjamin), né le 3 décembre 1993.\n0030 Mme Kherabi (Yousra), née le 23 décembre 1993.\n                                                              1\n"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
## [2] "0031 Mme Bourhis (Amélie, Marie-Sophie), née le 20 décembre 1993.\n0032 M. Montardi (Camille, Raphaël), né le 22 février 1994.\n0033 Mme Tian (Yuan), née le 28 juillet 1993.\n0034 M. Dighiero Brecht (Thomas, Pablo), né le 7 septembre 1993.\n0035 M. Perraud (Ludovic), né le 23 mars 1993.\n0036 M. Roussotte (Mickaël, Jean, Alain), né le 9 mars 1993.\n0037 M. Hoellinger (Baptiste, André, Joseph), né le 9 juillet 1993.\n0038 M. Alloune (Rayan), né le 25 mars 1993.\n0039 M. Mesny (Emmanuel, André), né le 7 mai 1993.\n0040 M. Lognon (Pierre, Antoine), né le 8 juin 1993.\n0041 Mme Tuaz (Estelle), née le 27 juin 1992.\n0042 M. Roulleaux Dugage (Matthieu, Marie), né le 8 mars 1993.\n0043 M. Hanotin (Clément), né le 14 janvier 1992.\n0044 M. Hage (Alexandre), né le 22 juillet 1993.\n0045 M. Robbe (Guillaume), né le 17 février 1994.\n0046 M. Derot (Simon, Robin, François), né le 3 juin 1993.\n0047 M. Finsterbach (Sonny, Philippe, Arsène), né le 28 janvier 1993.\n0048 M. Niddam (Samuel, Abraham, Henri), né le 17 août 1993.\n0049 Mme Hertzog (Tatiana, Marine), née le 28 février 1993.\n0050 Mlle Liu (Alice), née le 12 janvier 1994.\n0051 Mme Landré (Sophie, Anaïs), née le 17 février 1993.\n0052 M. Perol (Louis), né le 19 janvier 1990.\n0053 M. Cavaillez (Thibaud, Antoine), né le 2 janvier 1993.\n0054 M. Loeb (Jules), né le 25 juillet 1993.\n0055 Mme Bonello (Kim), née le 12 février 1992.\n0056 Mme Agouzoul (Sara), née le 5 avril 1993.\n0057 M. Blanquart (Erwan, Jean, Jules), né le 28 avril 1993.\n0058 Mme Forte (Valentine), née le 9 mai 1993.\n0059 Mlle Wilkin (Marie), née le 24 juillet 1993.\n0060 Mme Vignals (Carole), née le 8 octobre 1993.\n0061 M. Lampros (Alexandre), né le 18 novembre 1993.\n0062 M. Boulanger (Etienne, Marcel, Francis), né le 27 janvier 1994.\n0063 Mme Kouki (Inès), née le 30 juin 1994.\n0064 M. Bourreau (Alexis, François), né le 10 mai 1993.\n0065 M. Riller (Quentin, Marcel), né le 28 mars 1992.\n0066 M. Lefebvre (Erwan, Paul, Jacques), né le 16 octobre 1993.\n0067 Mlle Barré (Mathilde, Marie-Hélène), née le 12 mai 1992.\n0068 M. Orcel (Thibaud, Charles, Minh), né le 12 décembre 1994.\n0069 M. Wajchert (Thibaut, Pierre, Jean), né le 3 mars 1993.\n0070 M. Duteau (Vincent, Simon), né le 7 mars 1994.\n0071 Mme Jenvrin (Anaïs, Louisa, Léonie), née le 28 juillet 1993.\n0072 M. Gdalia (Raphaël, Félix, David), né le 8 juillet 1993.\n0073 M. Bouvarel (Hugo, Maurice, Marcel), né le 19 avril 1994.\n0074 M. Borouchaki (Antoine), né le 11 mai 1994.\n0075 M. Fawaz (Sami), né le 10 décembre 1993.\n0076 M. Zarka (Jonathan, Sacha, Menahem), né le 3 juillet 1991.\n0077 M. Creon (Antoine, Louis, Aurèle), né le 30 novembre 1992.\n0078 M. Chirpaz (Nicolas, Loïc), né le 31 décembre 1993.\n0079 M. Sakhi (Hichem), né le 10 octobre 1993.\n0080 Mlle Carayol (Ariane, Louise), née le 30 avril 1993.\n0081 Mme Thirouin (Jeanne, Marthe), née le 24 janvier 1995.\n0082 Mme Chastagner (Marine, Nathalie), née le 10 juin 1993.\n0083 Mme Roux (Camille, Madeleine, Hélène), née le 20 février 1993.\n0084 Mme Auger (Raphaëlle, Aurore), née le 1 octobre 1993.\n0085 M. Mauny (Philippe), né le 14 juillet 1983.\n0086 Mlle Even (Cecilia, Sophie, Ginette), née le 28 juin 1990.\n0087 Mme Lafargue (Marie-Camille), née le 15 octobre 1993.\n0088 M. De Guilhem De Lataillade (Adrien, Vincent, Jean-Marie), né le 7 février 1992.\n0089 M. Beneyto (Maxime), né le 1 juin 1994.\n0090 M. Ruiz (Thibault), né le 21 décembre 1992.\n0091 Mme Pietquin (Sophie), née le 6 novembre 1992.\n0092 M. Barde (François), né le 16 janvier 1993.\n0093 M. Pham (Félix, Khoa), né le 2 septembre 1993.\n0094 M. Fajardie (Antoine), né le 11 décembre 1994.\n0095 Mme Bouchard (Pauline, Marie, Charlotte), née le 25 juin 1993.\n0096 Mme Desjonqueres (Elvire), née le 22 février 1993.\n0097 Mme Mounacq (Audrey), née le 5 septembre 1993.\n0098 Mme Cachera (Laurène, Elise, Renée), née le 27 septembre 1993.\n                                                              2\n"                                                                                                                  
## [3] "0099 Mme Meynard (Lucie, Magdeleine, Marcelle), née le 9 août 1994.\n0100 M. Grimault (Dimitri, Olivier), né le 10 août 1992.\n0101 M. Garric (Antoine, Henri), né le 27 septembre 1993.\n0102 M. Colas (Quentin, Joël), né le 18 mars 1993.\n0103 M. Martin De Fremont (Grégoire, Marie), né le 1 septembre 1993.\n0104 M. Belkouche (Alban, Larbi), né le 28 décembre 1993.\n0105 M. Khitri (Mohammed Yacine), né le 15 novembre 1992.\n0106 M. Michelin (Bastien), né le 1 novembre 1992.\n0107 M. David-Muller (Marc), né le 6 juillet 1993.\n0108 Mme Lombes (Amélie), née le 15 décembre 1992.\n0109 Mme Costes (Domitille), née le 5 juillet 1993.\n0110 M. Boulet (Nicolas, Hugo), né le 10 novembre 1993.\n0111 Mme Rambaud (Elise), née le 11 décembre 1993.\n0112 M. Prud'homme (Léo), né le 10 octobre 1992.\n0113 M. Brizard (Antoine), né le 12 décembre 1993.\n0114 Mme Hoppenot (Bérénice, Marie-Brigitte, Christianne), née le 15 juillet 1993.\n0115 M. Sauer (François, Louis), né le 5 octobre 1993.\n0116 M. Mazhar (Driss, Olivier), né le 21 mai 1993.\n0117 M. Roumeau (Sébastien, Paul, André), né le 11 juin 1993.\n0118 M. Azoyan (Loris), né le 25 janvier 1993.\n0119 Mme Drillet (Gaëlle), née le 26 juin 1993.\n0120 M. Galland (Loïck, Philippe), né le 8 août 1993.\n0121 M. Frey (Samuel, Léon, Richard), né le 27 juin 1992.\n0122 Mlle Mausoléo (Aude, Emilie, Marie), née le 2 avril 1993.\n0123 M. Trimaille (Antonin), né le 9 janvier 1995.\n0124 Mme Gonsard (Apolline), née le 16 octobre 1993.\n0125 M. Gressens (Simon), né le 26 août 1992.\n0126 Mme Manse (Léa, Muriel), née le 9 juillet 1993.\n0127 Mme Guilloit (Azalais, Bernadette, Solange), née le 2 novembre 1993.\n0128 M. Renault (Valentin), né le 24 avril 1994.\n0129 Mme Berardi (Giulia), née le 17 septembre 1993.\n0130 M. Berdugo (Kevin), né le 30 juin 1992.\n0131 M. Fourdinier (Victor, Philippe, Thierry), né le 15 décembre 1993.\n0132 Mme Pina (Héloïse, Marceline), née le 28 mai 1994.\n0133 M. Marchiset (Antoine), né le 13 mai 1992.\n0134 M. Monnin (Charles, Germain, Claude), né le 1 avril 1993.\n0135 M. Briens (Aurélien), né le 15 juillet 1989.\n0136 M. Ruiz (François, Jean-Claude), né le 19 décembre 1993.\n0137 M. Hamon (Antoine), né le 30 novembre 1993.\n0138 M. Delange (Boris, Romain), né le 16 novembre 1992.\n0139 M. Carval (Thibaut, Benoît, François), né le 1 décembre 1993.\n0140 Mlle Bach (Emma, Marie, Catherine), née le 29 novembre 1993.\n0141 M. Babin (Matthias), né le 3 octobre 1992.\n0142 Mme Doira (Bilitis, Adelaïde), née le 14 août 1993.\n0143 M. Hilezian (Frédéric, Clément, Marc), né le 13 décembre 1994.\n0144 Mme Lajaunie (Rebecca, Sarah), née le 14 juillet 1990.\n0145 M. Le Carpentier (Aymeric, Jean-Claude, Jules), né le 24 août 1994.\n0146 M. Le Boite (Hugo, Charles, Louis), né le 30 mars 1992.\n0147 M. Lombardi (Yannis, Jérémie), né le 3 septembre 1993.\n0148 Mme Lasvergnas (Julie, Marie, Jeanne), née le 30 juillet 1994.\n0149 Mlle O'keane (Aurélie, Deirdre, Nolwenn), née le 27 décembre 1993.\n0150 M. Letellier (Thibault, Jean-Claude, René), né le 29 août 1993.\n0151 Mme Dudok De Wit (Sarah), née le 8 août 1992.\n0152 M. Olory (Léo, Bruno, Claude), né le 30 juillet 1992.\n0153 Mme Vergneault (Hélène, Sarah, Micheline), née le 11 novembre 1993.\n0154 M. Le Breton (Guillaume), né le 11 octobre 1993.\n0155 Mme Ortoli (Manon), née le 30 octobre 1993.\n0156 Mme Schoch (Armelle, Christine, Dominique), née le 17 juillet 1992.\n0157 Mme Traineau (Hélène, Anne, Odile), née le 17 décembre 1992.\n0158 Mme Tessier (Dolores, Céline, Patrick), épouse Jean-Baptiste, née le 29 janvier 1993.\n0159 M. Touboul (Arnaud), né le 23 septembre 1993.\n0160 M. Mairot (Kevin), né le 16 mai 1993.\n0161 M. El Bèze (Nathan, Gabriel), né le 26 avril 1993.\n0162 M. Khansa (Rémi), né le 13 octobre 1992.\n0163 M. Temmar (Yassine), né le 28 septembre 1992.\n0164 M. Legghe (Benoît, Charles, Pierre), né le 9 juillet 1993.\n0165 M. Fournier (Nicolas, Julien, Henri), né le 9 septembre 1977.\n0166 Mme Lasbleiz (Adèle), née le 7 janvier 1993.\n                                                             3\n"

Parsing

I’ll use the little I know about regular expressions to parse this data.

pat <- "([0-9]{4} [M\\.|Mme|Mlle]{1}.*?, [né|née]{1}.*?)\\."
data <- unlist(gsubfn::strapply(txt, pattern = pat))

head(data)
## [1] "0001 Mme Beaumont (Anne-Lise), née le 1 septembre 1993"              
## [2] "0002 M. Petitdemange (Arthur, Paul, Joseph), né le 15 septembre 1993"
## [3] "0003 M. Bacon (Seraphin, Charly, Philippe), né le 29 janvier 1993"   
## [4] "0004 M. Ditac (Geoffroy, Arnaud, André), né le 23 juin 1994"         
## [5] "0005 M. Faure (Guillaume, Thomas), né le 7 août 1992"                
## [6] "0006 Mme Weil (Amandine), née le 4 mars 1992"
library(stringr)

data_parsed <- matrix(NA_character_, length(data), 7)
data_words <- str_extract_all(data, boundary("word"))
data_parsed[, 1:4] <- t(sapply(data_words, head, n = 4))
data_parsed[, 5:7] <- t(sapply(data_words, tail, n = 3))
head(data_parsed)
##      [,1]   [,2]  [,3]           [,4]        [,5] [,6]        [,7]  
## [1,] "0001" "Mme" "Beaumont"     "Anne"      "1"  "septembre" "1993"
## [2,] "0002" "M"   "Petitdemange" "Arthur"    "15" "septembre" "1993"
## [3,] "0003" "M"   "Bacon"        "Seraphin"  "29" "janvier"   "1993"
## [4,] "0004" "M"   "Ditac"        "Geoffroy"  "23" "juin"      "1994"
## [5,] "0005" "M"   "Faure"        "Guillaume" "7"  "août"      "1992"
## [6,] "0006" "Mme" "Weil"         "Amandine"  "4"  "mars"      "1992"
suppressMessages(library(tidyverse))

data_parsed2 <- as_tibble(data_parsed) %>%
  transmute(
    ranking = as.integer(V1),
    is_male = (V2 == "M"),
    family_name = V3,
    first_name = V4,
    birth_date = pmap(list(V5, V6, V7), function(d, m, y) {
      paste(d, m, y, collapse = " ")
    }) %>% lubridate::dmy()
  ) 

data_parsed2
## # A tibble: 8,370 x 5
##    ranking is_male  family_name first_name birth_date
##      <int>   <lgl>        <chr>      <chr>     <date>
##  1       1   FALSE     Beaumont       Anne 1993-09-01
##  2       2    TRUE Petitdemange     Arthur 1993-09-15
##  3       3    TRUE        Bacon   Seraphin 1993-01-29
##  4       4    TRUE        Ditac   Geoffroy 1994-06-23
##  5       5    TRUE        Faure  Guillaume 1992-08-07
##  6       6   FALSE         Weil   Amandine 1992-03-04
##  7       7    TRUE   Ezzouhairi      Nacim 1993-06-01
##  8       8    TRUE       Coulon    Antoine 1992-06-11
##  9       9   FALSE           Le      Gaudu 1994-06-03
## 10      10    TRUE        Boyer     Jeremy 1993-05-14
## # ... with 8,360 more rows

So, here there is a problem with the people who have a family names composed of multiple words.

Analysis

Proportion male/female

mean(data_parsed2$is_male)
## [1] 0.4345281

I’m still a bit surprised there are only 43% of males in French medical schools.

How old are they?

myggplot <- function(...) bigstatsr:::MY_THEME(ggplot(...))

myggplot(data_parsed2) +
  geom_histogram(aes(x = birth_date), bins = 100)

If one pass without repeating any year, they would be born in 1993, like me. There are a lot of people who repeat the first year because it is a very selective competitive examination, so who were born in 1992. Yet, there are quite a lot of older people and even some very young ones (we’ll see more in another plot).

How males compare to females when it comes to ranking?

myggplot(mutate(data_parsed2, prop_male = cummean(data_parsed2$is_male))) + 
  geom_hline(yintercept = mean(data_parsed2$is_male), col = "red") +
  geom_line(aes(x = ranking, y = prop_male))

Even though the first one is a female, among the best ranked people, there is a majority of males.

Ranking versus Age

(ggplot(data_parsed2) +
   geom_point(aes(ranking, birth_date, color = is_male)) +
   aes(text = bigstatsr::asPlotlyText(data_parsed2))) %>%
  plotly::ggplotly(tooltip = "text")

We can see a girl of only 19 year old and with a really nice ranking and a 54-year old man (with a less nice ranking).

myggplot(data_parsed2, aes(ranking, birth_date)) +
  geom_point() +
  geom_smooth(aes(color = is_male), lwd = 2)
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'